2020-2021 Sunseeker Telemetry and Lighting System
eusci_a_spi_ex1_master.c
Go to the documentation of this file.
1 /* --COPYRIGHT--,BSD
2  * Copyright (c) 2017, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  * --/COPYRIGHT--*/
32 #include "driverlib.h"
33 //*****************************************************************************
49 // MSP430F67791A
76 //*****************************************************************************
77 
78 uint8_t RXData = 0;
79 uint8_t TXData = 0;
80 
81 void main(void)
82 {
83  volatile uint16_t i;
84 
85  //Stop watchdog timer
86  WDT_A_hold(WDT_A_BASE);
87 
88  //Configure Pins for UCA0CLK, UCA0TXD/UCA0SIMO, UCA0RXD/UCA0SOMI
89  //Set P3.0, P3.1, P3.2 as Module Function Input.
90  GPIO_setAsPeripheralModuleFunctionInputPin(
91  GPIO_PORT_P3,
92  GPIO_PIN0+ GPIO_PIN1 + GPIO_PIN2
93  );
94 
95  //Set the XT1 frequency to UCS
96  UCS_setExternalClockSource(32768, 0);
97 
98  //Initialize Master
99  EUSCI_A_SPI_initMasterParam param = {0};
100  param.selectClockSource = EUSCI_A_SPI_CLOCKSOURCE_SMCLK;
101  param.clockSourceFrequency = UCS_getSMCLK();
102  param.desiredSpiClock = 500000;
103  param.msbFirst = EUSCI_A_SPI_MSB_FIRST;
104  param.clockPhase = EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT;
105  param.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH;
106  param.spiMode = EUSCI_A_SPI_3PIN;
107  EUSCI_A_SPI_initMaster(EUSCI_A0_BASE, &param);
108 
109  //Enable SPI module
110  EUSCI_A_SPI_enable(EUSCI_A0_BASE);
111 
112  EUSCI_A_SPI_clearInterrupt(EUSCI_A0_BASE,
113  EUSCI_A_SPI_RECEIVE_INTERRUPT);
114  // Enable USCI_A0 RX interrupt
115  EUSCI_A_SPI_enableInterrupt(EUSCI_A0_BASE,
116  EUSCI_A_SPI_RECEIVE_INTERRUPT);
117 
118  //Wait for slave to initialize
119  __delay_cycles(100);
120 
121  TXData = 0x1; // Holds TX data
122 
123  //USCI_A0 TX buffer ready?
124  while (!EUSCI_A_SPI_getInterruptStatus(EUSCI_A0_BASE,
125  EUSCI_A_SPI_TRANSMIT_INTERRUPT)) ;
126 
127  //Transmit Data to slave
128  EUSCI_A_SPI_transmitData(EUSCI_A0_BASE, TXData);
129 
130  __bis_SR_register(LPM0_bits + GIE); // CPU off, enable interrupts
131  __no_operation(); // Remain in LPM0
132 }
133 
134 #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
135 #pragma vector=USCI_A0_VECTOR
136 __interrupt
137 #elif defined(__GNUC__)
138 __attribute__((interrupt(USCI_A0_VECTOR)))
139 #endif
140 void USCI_A0_ISR(void)
141 {
142  switch(__even_in_range(UCA0IV, USCI_SPI_UCTXIFG))
143  {
144  case USCI_SPI_UCRXIFG: // UCRXIFG
145  //USCI_A0 TX buffer ready?
146  while (!EUSCI_A_SPI_getInterruptStatus(EUSCI_A0_BASE,
147  EUSCI_A_SPI_TRANSMIT_INTERRUPT));
148 
149  RXData = EUSCI_A_SPI_receiveData(EUSCI_A0_BASE);
150 
151  //Increment data
152  TXData++;
153 
154  //Send next value
155  EUSCI_A_SPI_transmitData(EUSCI_A0_BASE,
156  TXData
157  );
158 
159  //Delay between transmissions for slave to process information
160  __delay_cycles(40);
161  break;
162  default:
163  break;
164  }
165 }
166 
uint8_t RXData
void main(void)
void USCI_A0_ISR(void)
uint8_t TXData
MPU_initThreeSegmentsParam param
__no_operation()
__delay_cycles(500000)